﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using Entidades.Sistema.Venta;

namespace Mapping.Sistema.Venta
{
    public static class MappingPedidos
    {
        public static List<Pedido> ConsultarPedidos()
        {
            SqlCommand cmdPedidos = new SqlCommand();
            cmdPedidos.CommandText = "sp_ConsultarPedido";

            cmdPedidos.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            if (cmdPedidos.Connection.State == System.Data.ConnectionState.Closed)
            {
                Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
                cmdPedidos.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            }

            cmdPedidos.CommandType = System.Data.CommandType.StoredProcedure;
            SqlDataReader drPedidos = cmdPedidos.ExecuteReader();
            List<Pedido> ColPedidos = new List<Pedido>();
            
            while (drPedidos.Read())
            {
                Pedido oPedido = new Pedido();

                oPedido.IdPedido = Convert.ToInt32(drPedidos["Id_Pedido"]);
                oPedido.Estado = (PedidosEstado)Enum.Parse(typeof(PedidosEstado), drPedidos["Estado"].ToString());
                oPedido.Fecha = Convert.ToDateTime(drPedidos["Fecha"]);
                oPedido.FechaEntrega = Convert.ToDateTime(drPedidos["FechaEntrega"]);
                oPedido.ImporteDescuento = Convert.ToDecimal(drPedidos["ImporteDescuento"]);
                oPedido.Cliente.IdCliente = Convert.ToInt32(drPedidos["IdCliente"]);
                oPedido.Cliente.Nombre = drPedidos["NombreCliente"].ToString();
                oPedido.Cliente.Cuit = drPedidos["Cuit"].ToString();
                oPedido.Cliente.Email = drPedidos["Email"].ToString();
                oPedido.Cliente.Telefono = drPedidos["Telefono"].ToString();
                oPedido.Cliente.Fax = drPedidos["Fax"].ToString();
                oPedido.Cliente.Calle = drPedidos["Calle"].ToString();
                oPedido.Cliente.NroCalle = Convert.ToInt32(drPedidos["NroCalle"]);
                oPedido.Cliente.Piso = Convert.ToInt32(drPedidos["Piso"]);
                oPedido.Cliente.Departamento = drPedidos["Departamento"].ToString();
                oPedido.Cliente.TipoCliente.IdTipoCliente = Convert.ToInt32(drPedidos["IdTipoCliente"]);
                oPedido.Cliente.TipoCliente.Nombre = drPedidos["NombreTipoCliente"].ToString();
                oPedido.Cliente.CondicionIva.IdCondicionIva = Convert.ToInt32(drPedidos["IdCondicionIva"]);
                oPedido.Cliente.CondicionIva.Nombre = drPedidos["NombreCondicionIva"].ToString();
                oPedido.Cliente.Barrio.IdBarrio = Convert.ToInt32(drPedidos["IdBarrio"]);
                oPedido.Cliente.Barrio.Nombre = drPedidos["NombreBarrio"].ToString();
                oPedido.Cliente.Barrio.Localidad.IdLocalidad = Convert.ToInt32(drPedidos["IdLocalidad"]);
                oPedido.Cliente.Barrio.Localidad.Nombre = drPedidos["NombreLocalidad"].ToString();
                oPedido.Cliente.Barrio.Localidad.CodigoPostal = Convert.ToInt32(drPedidos["CodigoPostal"]);
                oPedido.Cliente.Barrio.Localidad.Provincia.IdProvincia = Convert.ToInt32(drPedidos["IdProvincia"]);
                oPedido.Cliente.Barrio.Localidad.Provincia.Nombre = drPedidos["NombreProvincia"].ToString();

                SqlCommand cmd2Pedidos = new SqlCommand();
                cmd2Pedidos.CommandText = "sp_ConsultarDetallePedido";
                cmd2Pedidos.CommandType = System.Data.CommandType.StoredProcedure;
                cmd2Pedidos.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                cmd2Pedidos.Parameters.Add("@IdPedido", System.Data.SqlDbType.Int).Value = oPedido.IdPedido;
                SqlDataReader drDetellePedido = cmd2Pedidos.ExecuteReader();

                while (drDetellePedido.Read())
                {
                    DetallePedido oDetPedido = new DetallePedido();

                    oDetPedido.Cantidad = Convert.ToInt32(drDetellePedido["Cantidad"]);
                    oDetPedido.Estado = (StatesDetalle)Enum.Parse(typeof(StatesDetalle), drDetellePedido["EstadoDet"].ToString());
                    oDetPedido.Producto.IdProducto = Convert.ToInt32(drDetellePedido["Id_ProductoProd"]);
                    oDetPedido.IdDetallePedido = oDetPedido.Producto.IdProducto;
                    oDetPedido.Producto = Mapping.Sistema.Venta.MappingProductos.ConsultarProductoPorClave(oDetPedido.Producto.IdProducto);
                    
                    oPedido.AgregarDetalle(oDetPedido);
                }

                ColPedidos.Add(oPedido);
            }

            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
            return ColPedidos;
        }

        public static Pedido ConsultarPedidoLeerPorClave(int idpedido)
        {
            SqlCommand cmdPedidos = new SqlCommand();
            cmdPedidos.CommandText = "sp_ConsultarPedidoLeerPorClave";

            cmdPedidos.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            if (cmdPedidos.Connection.State == System.Data.ConnectionState.Closed)
            {
                Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
                cmdPedidos.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            }

            cmdPedidos.CommandType = System.Data.CommandType.StoredProcedure;
            cmdPedidos.Parameters.Add("@Id_Pedido", System.Data.SqlDbType.Int).Value = idpedido;
            SqlDataReader drPedidos = cmdPedidos.ExecuteReader();

            Pedido oPedido = new Pedido();

            while (drPedidos.Read())
            {   
                oPedido.IdPedido = Convert.ToInt32(drPedidos["Id_Pedido"]);
                oPedido.Estado = (PedidosEstado)Enum.Parse(typeof(PedidosEstado), drPedidos["Estado"].ToString());
                oPedido.Fecha = Convert.ToDateTime(drPedidos["Fecha"]);
                oPedido.FechaEntrega = Convert.ToDateTime(drPedidos["FechaEntrega"]);
                oPedido.ImporteDescuento = Convert.ToDecimal(drPedidos["ImporteDescuento"]);
                oPedido.Cliente.IdCliente = Convert.ToInt32(drPedidos["IdCliente"]);
                oPedido.Cliente.Nombre = drPedidos["NombreCliente"].ToString();
                oPedido.Cliente.Cuit = drPedidos["Cuit"].ToString();
                oPedido.Cliente.Email = drPedidos["Email"].ToString();
                oPedido.Cliente.Telefono = drPedidos["Telefono"].ToString();
                oPedido.Cliente.Fax = drPedidos["Fax"].ToString();
                oPedido.Cliente.Calle = drPedidos["Calle"].ToString();
                oPedido.Cliente.NroCalle = Convert.ToInt32(drPedidos["NroCalle"]);
                oPedido.Cliente.Piso = Convert.ToInt32(drPedidos["Piso"]);
                oPedido.Cliente.Departamento = drPedidos["Departamento"].ToString();
                oPedido.Cliente.TipoCliente.IdTipoCliente = Convert.ToInt32(drPedidos["IdTipoCliente"]);
                oPedido.Cliente.TipoCliente.Nombre = drPedidos["NombreTipoCliente"].ToString();
                oPedido.Cliente.CondicionIva.IdCondicionIva = Convert.ToInt32(drPedidos["IdCondicionIva"]);
                oPedido.Cliente.CondicionIva.Nombre = drPedidos["NombreCondicionIva"].ToString();
                oPedido.Cliente.Barrio.IdBarrio = Convert.ToInt32(drPedidos["IdBarrio"]);
                oPedido.Cliente.Barrio.Nombre = drPedidos["NombreBarrio"].ToString();
                oPedido.Cliente.Barrio.Localidad.IdLocalidad = Convert.ToInt32(drPedidos["IdLocalidad"]);
                oPedido.Cliente.Barrio.Localidad.Nombre = drPedidos["NombreLocalidad"].ToString();
                oPedido.Cliente.Barrio.Localidad.CodigoPostal = Convert.ToInt32(drPedidos["CodigoPostal"]);
                oPedido.Cliente.Barrio.Localidad.Provincia.IdProvincia = Convert.ToInt32(drPedidos["IdProvincia"]);
                oPedido.Cliente.Barrio.Localidad.Provincia.Nombre = drPedidos["NombreProvincia"].ToString();
                

                SqlCommand cmd2Pedidos = new SqlCommand();
                cmd2Pedidos.CommandText = "sp_ConsultarDetallePedido";
                cmd2Pedidos.CommandType = System.Data.CommandType.StoredProcedure;
                cmd2Pedidos.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                cmd2Pedidos.Parameters.Add("@IdPedido", System.Data.SqlDbType.Int).Value = oPedido.IdPedido;
                SqlDataReader drDetellePedido = cmd2Pedidos.ExecuteReader();

                while (drDetellePedido.Read())
                {
                    DetallePedido oDetPedido = new DetallePedido();

                    oDetPedido.Cantidad = Convert.ToInt32(drDetellePedido["Cantidad"]);
                    oDetPedido.Estado = (StatesDetalle)Enum.Parse(typeof(StatesDetalle), drDetellePedido["EstadoDet"].ToString());
                    oDetPedido.Producto.IdProducto = Convert.ToInt32(drDetellePedido["Id_ProductoProd"]);
                    oDetPedido.IdDetallePedido = oDetPedido.Producto.IdProducto;
                    oDetPedido.Producto = Mapping.Sistema.Venta.MappingProductos.ConsultarProductoPorClave(oDetPedido.Producto.IdProducto);

                    oPedido.AgregarDetalle(oDetPedido);
                }
            }

            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
            return oPedido;
        }

        public static int AgregarPedido(Pedido oPedido)
        {
            SqlCommand cmdPedidos = new SqlCommand();
            cmdPedidos.CommandText = "sp_AgregarPedido";
            cmdPedidos.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
            cmdPedidos.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdPedidos.Parameters.Add("@Id_Pedido", System.Data.SqlDbType.Int).Value = oPedido.IdPedido;
            cmdPedidos.Parameters.Add("@Estado", System.Data.SqlDbType.VarChar).Value = oPedido.Estado.ToString();
            cmdPedidos.Parameters.Add("@Fecha", System.Data.SqlDbType.Date).Value = oPedido.Fecha;
            cmdPedidos.Parameters.Add("@FechaEntrega", System.Data.SqlDbType.Date).Value = oPedido.FechaEntrega;
            cmdPedidos.Parameters.Add("@Id_Cliente", System.Data.SqlDbType.Int).Value = oPedido.Cliente.IdCliente;
            cmdPedidos.Parameters.Add("@ImporteDescuento", System.Data.SqlDbType.Float).Value = oPedido.ImporteDescuento;

            int nro = Convert.ToInt32(cmdPedidos.ExecuteScalar());

            foreach (DetallePedido det in oPedido.DetallePedidos)
            {
                AgregarDetallePedido(oPedido.IdPedido, det);
            }

            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
            return nro;
        }
        public static bool EliminarPedido(Pedido oPedido)
        {

            SqlCommand cmdDetallePedido = new SqlCommand();
            cmdDetallePedido.CommandText = "sp_EliminarDetallePedido";            
            cmdDetallePedido.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
            cmdDetallePedido.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdDetallePedido.Parameters.Add("@Id_Pedido", System.Data.SqlDbType.Int).Value = oPedido.IdPedido;
            cmdDetallePedido.ExecuteNonQuery();

            SqlCommand cmdPedidos = new SqlCommand();
            cmdPedidos.CommandText = "sp_EliminarPedido";
            cmdPedidos.CommandType = System.Data.CommandType.StoredProcedure;
            cmdPedidos.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdPedidos.Parameters.Add("@Id_Pedido", System.Data.SqlDbType.Int).Value = oPedido.IdPedido;
            cmdPedidos.ExecuteNonQuery();
            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");

            return true;
        }
        public static int ModificarPedido(Pedido oPedido)
        {
            SqlCommand cmdPedidos = new SqlCommand();
            cmdPedidos.CommandText = "sp_ModificarPedido";
            cmdPedidos.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
            cmdPedidos.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdPedidos.Parameters.Add("@Id_Pedido", System.Data.SqlDbType.Int).Value = oPedido.IdPedido;
            cmdPedidos.Parameters.Add("@Estado", System.Data.SqlDbType.VarChar).Value = oPedido.Estado.ToString();
            cmdPedidos.Parameters.Add("@Fecha", System.Data.SqlDbType.Date).Value = oPedido.Fecha;
            cmdPedidos.Parameters.Add("@FechaEntrega", System.Data.SqlDbType.Date).Value = oPedido.FechaEntrega;
            cmdPedidos.Parameters.Add("@Id_Cliente", System.Data.SqlDbType.Int).Value = oPedido.Cliente.IdCliente;
            cmdPedidos.Parameters.Add("@ImporteDescuento", System.Data.SqlDbType.Float).Value = oPedido.ImporteDescuento;
            int nro = Convert.ToInt32(cmdPedidos.ExecuteScalar());

            EliminarDetallePedido(oPedido.IdPedido);

            foreach(DetallePedido det in oPedido.DetallePedidos)
            {                
                AgregarDetallePedido(oPedido.IdPedido, det);
            }

            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
            return nro;
        }

        public static int ModificarPedidoAPenFacturado(Pedido oPedido)
        {
            SqlCommand cmdPedidos = new SqlCommand();
            cmdPedidos.CommandText = "sp_ModificarPedidoAFacturado";
            cmdPedidos.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
            cmdPedidos.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdPedidos.Parameters.Add("@Id_Pedido", System.Data.SqlDbType.Int).Value = oPedido.IdPedido;
            cmdPedidos.Parameters.Add("@Estado", System.Data.SqlDbType.VarChar).Value = PedidosEstado.PendienteFacturacion.ToString();
            int nro = Convert.ToInt32(cmdPedidos.ExecuteScalar());            

            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
            return nro;
        }
        public static int ModificarPedidoAFacturado(int id)
        {
            SqlCommand cmdPedidos = new SqlCommand();
            cmdPedidos.CommandText = "sp_ModificarPedidoAFacturado";
            cmdPedidos.CommandType = System.Data.CommandType.StoredProcedure;
            Servicios.Conexion.ObtenerInstancia().Conectar("Sistema");
            cmdPedidos.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdPedidos.Parameters.Add("@Id_Pedido", System.Data.SqlDbType.Int).Value = id;
            cmdPedidos.Parameters.Add("@Estado", System.Data.SqlDbType.VarChar).Value = PedidosEstado.Facturado.ToString();
            int nro = Convert.ToInt32(cmdPedidos.ExecuteScalar());

            Servicios.Conexion.ObtenerInstancia().Desconectar("Sistema");
            return nro;
        }

        public static bool AgregarDetallePedido(int IdPedido, DetallePedido oDetallePedido)
        {            

                SqlCommand cmdDetallePedido = new SqlCommand();
                cmdDetallePedido.CommandText = "sp_AgregarDetallePedido";                
                cmdDetallePedido.CommandType = System.Data.CommandType.StoredProcedure;
                cmdDetallePedido.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
                cmdDetallePedido.Parameters.Add("@Id_Pedido", System.Data.SqlDbType.Int).Value = IdPedido;
                cmdDetallePedido.Parameters.Add("@Id_Producto", System.Data.SqlDbType.Int).Value = oDetallePedido.Producto.IdProducto;
                cmdDetallePedido.Parameters.Add("@Cantidad", System.Data.SqlDbType.Int).Value = oDetallePedido.Cantidad;
                cmdDetallePedido.Parameters.Add("@Estado", System.Data.SqlDbType.VarChar).Value = oDetallePedido.Estado.ToString();
                cmdDetallePedido.ExecuteNonQuery();               

                return true;
        }
        public static bool EliminarDetallePedido(int IdPedido)
        { 
            SqlCommand cmdDetallePedido = new SqlCommand();
            cmdDetallePedido.CommandText = "sp_EliminarDetallePedido";            
            cmdDetallePedido.CommandType = System.Data.CommandType.StoredProcedure;
            
            cmdDetallePedido.Connection = Servicios.Conexion.ObtenerInstancia().RetornarConexion();
            cmdDetallePedido.Parameters.Add("@Id_Pedido", System.Data.SqlDbType.Int).Value = IdPedido;
            cmdDetallePedido.ExecuteNonQuery();
            
            
            return true;
        }       
    }
}
